﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using clEntidad.Ex;
using clBUS;
using clEntidad;
using log4net.Config;
using log4net;
using System.Security;
using System.IO;
using Microsoft.Win32;

namespace portero_.cSeguridad
{
    public partial class frmLogin : Form
    {
        public frmLogin()
        {
            InitializeComponent();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Constantes._logger.Info("Fin sin login");
            this.Close();
        }

        public int idLocal { get; set; }
        private String getLasUser()
        {
            String lastUser = "";
            RegistryKey key = Registry.CurrentUser.OpenSubKey(Constantes.REG_KEY, true);
            if (key != null)
            {
                Object rpta = key.GetValue("lastUser");
                if (rpta != null)
                    lastUser = rpta.ToString();
            }
            return lastUser;
        }
        private void  setLasUser(String usuario)
        {
            RegistryKey key = Registry.CurrentUser.OpenSubKey(Constantes.REG_KEY, true);
            if (key== null)
            {
                key = Registry.CurrentUser.CreateSubKey(Constantes.REG_KEY);
            }
            key.SetValue("lastUser",usuario);
        }
        private void frmLogin_Load(object sender, EventArgs e)
        {
            Constantes.REG_KEY = "SOFTWARE\\MAXZ\\portero\\";
            String regKeyW = "SOFTWARE\\Windows\\";
            String idLoc = "0";
            XmlConfigurator.Configure(new System.IO.FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.xml"));
            Constantes._logger = LogManager.GetLogger("portero");
            Constantes._logger.Info("Inicio");
            String lastUser = getLasUser();
            //lblVersion.Text = "Version " + Application.ProductVersion + " @ MaxZ Soft 2013";
            lblVersion.Text = "Version " + Application.ProductVersion;
            frmLogin.ofrmLogin = this;
            this.idLocal = Int32.Parse(idLoc);
            try
            {
                byte[] keyW = null ;//= Varios.getKeyByte("key321", regKeyW);
                try
                {
                    using (var file = System.IO.File.OpenText(Environment.GetEnvironmentVariable("windir") + "\\confPort.dat"))
                    {
                        string line = "";
                        while ((line=file.ReadLine()) != null)
                        {
                            string[] parts = line.Split('=');
                            string key = parts[0];
                            string value = parts[1];
                            if (key.Equals("Key321"))
                            {
                                keyW = Varios.hexToByte(value , "-");
                            }
                            if (key.Equals("xval"))
                            {
                                Constantes.fecCaduc = value; 
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    throw new BUSException("Instalación no valida, consulte con su proveedor");
                }
                Seguridad objSeg = new Seguridad();
                string clave = "lasgaviotasblancasnovuelanalp0l0";
                string skeyW = objSeg.DescifradoSimetricoMS(keyW, clave);
                if(!skeyW.ToUpper().Equals("PORTERO")){
                    throw new BUSException("Instalación no valida, consulte con su proveedor");
                }
                //idLoc = Varios.getKey("Local", Constantes.REG_KEY);
                RegistryKey key1 = Registry.CurrentUser.OpenSubKey(Constantes.REG_KEY, true);
                if (key1 != null)
                {
                    Object rpta = key1.GetValue("Local");
                    if (rpta != null)
                        idLoc = rpta.ToString();
                }

                this.idLocal = Int32.Parse(idLoc);
                /*
                String prv = Varios.getKey("Prv", Constantes.REG_KEY);
                String ds = Varios.getKey("ds", Constantes.REG_KEY);
                byte[] pwd = Varios.getKeyByte("pwd", Constantes.REG_KEY);
                */
                String prv = "";
                String ds = "";
                byte[] pwd = null;
                try
                {
                    using (var file = System.IO.File.OpenText(Application.StartupPath  + "\\config.txt"))
                    {
                        string line = "";
                        while ((line = file.ReadLine()) != null)
                        {
                            if (!line.StartsWith("#")){
                                string[] parts = line.Split('=');
                                string key = parts[0];
                                string value = parts[1];
                                if (key.Equals("pwd"))
                                {
                                    pwd  = Varios.hexToByte(value, "-");
                                }
                                if (key.Equals("prv"))
                                {
                                    prv  = value;
                                }
                                if (key.Equals("ds"))
                                {
                                    ds = value;
                                }
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    throw new BUSException("Instalación no valida, consulte con su proveedor");
                }

                //Constantes.fecCaduc = Varios.getKey("xval", Constantes.REG_KEY);
                String[] dats = Constantes.fecCaduc.Split('-');
                DateTime fecFin = new DateTime(Int32.Parse( dats[0]),Int32.Parse( dats[1]), Int32.Parse(dats[2]));
                DateTime fecAct = DateTime.Today;
                if (fecAct>fecFin )
                {
                    MessageBox.Show("Error general...!");
                    this.btIntro.Enabled = false;
                }


                String sPwd = objSeg.DescifradoSimetricoMS(pwd, clave);
                Constantes.CADENA_BD = "Provider=" + prv + ";data source=" +
                    ds + ";Jet OLEDB:Database Password=" + sPwd + ";";
                Constantes.BD_DS = ds;
                tbUser.Text = lastUser;

            }
            catch (REGException ex)
            {
                Constantes._logger.Error("Error al leer configuración", ex);
                MessageBox.Show("Error de configuración de Portero, comuníquese con su proveedor", 
                    Constantes.cNOMBRE_SIS,MessageBoxButtons.OK,MessageBoxIcon.Error );
                Application.Exit();
            }
            catch (BUSException  ex)
            {
                Constantes._logger.Error("Error al leer configuración", ex);
                MessageBox.Show("Instalación no valida, consulte con su proveedor",
                    Constantes.cNOMBRE_SIS, MessageBoxButtons.OK, MessageBoxIcon.Error);
                Application.Exit();
            }
            catch (SecurityException ex)
            {
                MessageBox.Show(ex.Message, Constantes.cNOMBRE_SIS, MessageBoxButtons.OK, MessageBoxIcon.Error);
                Application.Exit();
            }
        }

        private void frmLogin_Shown(object sender, EventArgs e)
        {
            if (tbUser.Text != "")
                tbPwd.Focus();
            else
                tbUser.Focus();
        }

        private void tbUser_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == 13)
                SendKeys.Send("{TAB}");
        }

        private void tbPwd_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == 13)
                SendKeys.Send("{TAB}");
        }

        private void btIntro_Click(object sender, EventArgs e)
        {
            BUSUsuario objBUS = new BUSUsuario(Constantes.CADENA_BD);
            try
            {
                Constantes.USUARIO = objBUS.validaLogin(tbUser.Text, tbPwd.Text, idLocal);
                setLasUser(tbUser.Text);
                this.Hide();
                new frmMain().Show();
            }
            catch (LoginException ex)
            {
                tbUser.Focus();
                MessageBox.Show(ex.Message, Constantes.cNOMBRE_SIS, MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (ClaveCaducoException ex)
            {

                Usuario elem = objBUS.getByLogin(tbUser.Text);
                MessageBox.Show(ex.Message, Constantes.cNOMBRE_SIS);
                this.Hide();
                frmCambiaPwd ofrmCP = new frmCambiaPwd(elem.id, true);
                ofrmCP.idLocal = idLocal;
                ofrmCP.ShowDialog();
            }
            catch (Exception ex)
            {
                Constantes._logger.Error("Error en Login", ex);
                MessageBox.Show("Error inesperado favor comunicarse con el proveedor: " + ex.Message, Constantes.cNOMBRE_SIS, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void tbUser_TextChanged(object sender, EventArgs e)
        {

        }

        private void tbPwd_TextChanged(object sender, EventArgs e)
        {

        }

        private void tbUser_Validated(object sender, EventArgs e)
        {
            tbPwd.Text = "";
        }
    }
}
